﻿using Seg.Entidades;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Seg.Datos
{
    public class OpcionDatos
    {
        BD_SEGEntities context = new BD_SEGEntities();

        public List<OpcionResult> Listar(int CodigoSistema, int CodigoModulo, int CodigoPerfil)
        {


            //var datos = context.Opcion.Join(context.PerfilOpcion,
            //                                opc => opc.CodigoOpcion,
            //                                popc => popc.CodigoOpcion,
            //                                (opc, popc) => new { Opcion = opc, PerfilOpc = popc }).
            //                                Select(item => new DTOOpcion
            //                                {
            //                                    Codigo = item.PerfilOpc.Opcion.CodigoOpcion,
            //                                    Descripcion = item.PerfilOpc.Opcion.Descripcion
            //                                }).ToList();

           var datos = context.SPListarOpcion(CodigoPerfil, CodigoModulo, CodigoSistema).ToList();//.OrderBy(X=>new {X.CodigoSistema, X.CodigoModulo, X.CodigoPerfil}).ToList();
           return datos;
        }
        public List<SEGSS_OPCION_X_PERFIL_Result> ListarXPerfil(int CodigoPerfil)
        {
            var datos = context.SEGSS_OPCION_X_PERFIL(CodigoPerfil).ToList();//.Opcion.Where(x => (x.Anulado == false)).ToList();

            return datos;
        }
        int GenerarCodigo()
        {
            var actual = context.Opcion.Max(x => x.CodigoOpcion);
            return actual + 1;
        }
        public List<Opcion> ContarOpcion(int nivel,int? CodigoOpcion,int? CodigoOpcionPadre)
        {
            var datos = new List<Seg.Entidades.Opcion>();
            if (CodigoOpcion == null)
            {
                datos = context.Opcion.Where(x => x.Nivel == nivel).ToList();
            }
            else
            {
                datos = context.Opcion.Where(x => x.CodigoOpcionPadre == CodigoOpcion).ToList();
            }
            return datos;
        }
        public Opcion OpcionXCodigo(int CodigoOpcion)
        {
            var datos = context.Opcion.Where(x => x.CodigoOpcion == CodigoOpcion).FirstOrDefault();
            return datos;
        }
        public int Insertar(Opcion entidad,decimal codigoPerfil )
        {
            entidad.CodigoOpcion = GenerarCodigo();
            context.Opcion.Add(entidad);

            Int16 nuevoOrdenA = 0;

            if (entidad.CodigoOpcionPadre != null)
            {
               var nuevoOrden = context.Opcion.Where(x => x.CodigoOpcionPadre == entidad.CodigoOpcionPadre).
                                 Join(context.PerfilOpcion.Where(Y => Y.CodigoPerfil == codigoPerfil),
                                 o => o.CodigoOpcion,
                                 poj => poj.CodigoOpcion,
                                 (o, poj) => poj.Orden).Max();

               nuevoOrdenA = Convert.ToInt16(nuevoOrden);
            }
            else {

               var nuevoOrden = context.Opcion.Where(x => x.CodigoOpcionPadre == null ).
                                   Join(context.PerfilOpcion.Where(Y => Y.CodigoPerfil == codigoPerfil),
                                   o => o.CodigoOpcion,
                                   poj => poj.CodigoOpcion,
                                   (o, poj) => poj.Orden).Max();
               nuevoOrdenA = Convert.ToInt16(nuevoOrden);
            
            }

            if (nuevoOrdenA == null) nuevoOrdenA = 1;
            else nuevoOrdenA = Convert.ToInt16(nuevoOrdenA + 1);

            PerfilOpcion po = new PerfilOpcion();
            po.CodigoPerfil =Convert.ToInt32( codigoPerfil);
            po.CodigoOpcion = entidad.CodigoOpcion;
            po.Anulado = false;
            po.FechaCreacion = DateTime.Now;
            po.UsuarioCreacion =entidad.UsuarioCreacion;
            po.Orden = nuevoOrdenA;

            context.PerfilOpcion.Add(po);

            context.SaveChanges();
            return 1;
        }
        public int Eliminar(int id)
        {
            var obj = context.Opcion.Where(x => x.CodigoOpcion == id).FirstOrDefault();
            obj.Anulado = true;
            var r = context.SaveChanges();
            return r;
        }
        public int Actualizar(Opcion entidad)
        {
            var obj = context.Opcion.Where(x => x.CodigoOpcion == entidad.CodigoOpcion).FirstOrDefault();
            obj.Nivel = entidad.Nivel;
            obj.Nombre = entidad.Nombre;
            obj.Ruta = entidad.Ruta;
            obj.Descripcion = entidad.Descripcion;
            obj.CodigoOpcionPadre = entidad.CodigoOpcionPadre;
            obj.Anulado = entidad.Anulado;

            var r = context.SaveChanges();
            return r;
        }
        public List<Opcion> OpcionAutoCompletado(string descripcion)
        {
            var datos = new List<Seg.Entidades.Opcion>();

            datos = context.Opcion.Where(x =>
                ((x.Nombre.Contains(descripcion) || x.Descripcion.Contains(descripcion))
                && (x.Anulado == false))
                ).ToList();

            return datos;
        }
        public List<SEGSS_OPCION_X_SITUACION_Result> ListarOpcion(int CodigoSistema, int CodigoModulo, int CodigoPerfil,string anulado)
        {
            var datos = new List<Seg.Entidades.SEGSS_OPCION_X_SITUACION_Result>();
            int anul = 2;
            if (anulado == "A")
            {
                anul = 0;
            }
            else if (anulado == "I")
            {
                anul = 1;
            }
            datos = context.SEGSS_OPCION_X_SITUACION(CodigoPerfil, CodigoModulo, CodigoSistema, anul).ToList();
            return datos;
        }
        public List<SEGSS_USUARIO_X_NOMBRE_Result> ListaUsuarioXRoles(string Nombre, string anulado)
        {
            var datos = new List<Seg.Entidades.SEGSS_USUARIO_X_NOMBRE_Result>();
            datos = context.SEGSS_USUARIO_X_NOMBRE(Nombre,2).ToList();
            return datos;
        }

        public List<SEGSS_OPCION_X_USU_PERFIL_Result> ListarOpcionXPerfilUsu(int CodigoPerfilUsuario, int CodigoPerfil)
        {
            return context.SEGSS_OPCION_X_USU_PERFIL(CodigoPerfilUsuario, CodigoPerfil).ToList();
        }
        public List<SEGSS_OPCION_X_PERFIL_PADRE_Result> ListarXPerfilOpcPadre(int CodigoPerfil,int CodigoOpcionPadre)
        {
            return context.SEGSS_OPCION_X_PERFIL_PADRE(CodigoPerfil, CodigoOpcionPadre).ToList();
 
        }

        public int ActualizarOrden(int CodigoPerfil, int CodigoOpcion, short Orden, int UsuarioActual, int CodigoOpcionPadre)
        {
        
           //var obj = context.PerfilOpcion.Where(x => x.CodigoOpcion == CodigoOpcion && x.CodigoPerfil==CodigoPerfil).FirstOrDefault();
           // obj.Orden = Orden;
           // obj.UsuarioModificacion = UsuarioActual;
           // obj.FechaModificacion = DateTime.Now;
          
           // var r = context.SaveChanges();
            return context.SEGSU_ORDEN_OPCION_X_PERFIL(CodigoPerfil, CodigoOpcion, Orden, UsuarioActual, CodigoOpcionPadre);
        
        }
        public int ValidarUsuarioXPerfilUsuario(int CodigoOficina, int CodigoPerfil, int CodigoUsuario)
        {
            int resultado=0;
            var dato = context.SEGSS_VALIDAR_USUARIO_X_USUARIO_PERFIL(CodigoOficina, CodigoPerfil, CodigoUsuario);
            if (dato!=null)
            {
                var valor=dato.ToList();
                resultado=valor[0].Value;

            }
            return resultado;
        }
    }
}
